package com.tm;

import java.util.Date;

import org.apache.log4j.Logger;
import org.springframework.scheduling.annotation.Scheduled;
import org.springframework.stereotype.Component;

import com.tm.service.OrderService;
import com.tm.service.SpSkuInfoService;
import com.tm.util.DateUtilsEx;


/**
 * 定时任务类
 * 主要处理悟空平台所有需要定时执行的业务
 * 
 * @author GXL
 *
 */
@Component
public class Jobs {
	
	private Logger logger = Logger.getLogger(Jobs.class);
	
	/**
	 * * 第一位，表示秒，取值0-59
		* 第二位，表示分，取值0-59
		* 第三位，表示小时，取值0-23
		* 第四位，日期天/日，取值1-31
		* 第五位，日期月份，取值1-12
		* 第六位，星期，取值1-7，星期一，星期二...，注：不是第1周，第二周的意思
		          另外：1表示星期天，2表示星期一。
		* 第7为，年份，可以留空，取值1970-2099
		
		0 0 3 * * ?     每天3点执行
		0 5 3 * * ?     每天3点5分执行
		0 5 3 ? * *     每天3点5分执行，与上面作用相同
		0 5/10 3 * * ?  每天3点的 5分，15分，25分，35分，45分，55分这几个时间点执行
		0 10 3 ? * 1    每周星期天，3点10分 执行，注：1表示星期天    
		0 10 3 ? * 1#3  每个月的第三个星期，星期天 执行，#号只能出现在星期的位置
		
		fixedDelay:每次执行任务之后间隔多久再次执行该任务
		initialDelay :初次执行任务之前需要等待的时间
		fixedRate:执行频率，每隔多少时间就启动任务，不管该任务是否启动完成
		cron:设置时分秒等具体的定时

	 */
	public final static long ONE_Minute =  60 * 1000;//一分钟
	public final static long FIVE_Minute =  5 * 60 * 1000;//五分钟
	public final static long ONE_Hour =  60 * 60 * 1000;//一小时
	public final static long FOUR_Hour =  4 * 60 * 60 * 1000;//四小时
	public final static long ONE_Day =  24 * 60 * 60 * 1000;//一天
	public final static String MEMBER_CLEAR_TIME =  "0 59 23 ? * *";//每天23点59分 执行
	public final static String SIGN_REMIND_TIME =  "0 0 9 ? * *";//每天9点 执行
	
	
    @Scheduled(cron="0 15 3 * * ?")
    public void cronJob(){
        System.out.println(DateUtilsEx.formatToString(new Date(), DateUtilsEx.DATE_FORMAT_SEC)+" >>cron执行....");
    }
    
    /**
     * 修改到期未支付订单状态
     */
    @Scheduled(initialDelay = 20000, fixedRate = FIVE_Minute)
    public void merchantStateUpdate(){
    	logger.info(DateUtilsEx.formatToString(new Date(), DateUtilsEx.DATE_FORMAT_SEC)+" >>修改到期未支付订单状态定时任务启动....");
    	try{
    		OrderService oService = SpringUtil.getBean(OrderService.class);
    		
    		ResultEntity re = oService.updateNotPayLimitOrderState();
    		
    		if("0".equals(re.getCode())){
    			logger.info(DateUtilsEx.formatToString(new Date(), DateUtilsEx.DATE_FORMAT_SEC)+" >>修改到期未支付订单状态定时任务执行成功....");
    		}else{
    			logger.error(DateUtilsEx.formatToString(new Date(), DateUtilsEx.DATE_FORMAT_SEC)+" >>修改到期未支付订单状态定时任务执行失败....");
    		}
    		
    	}catch(Exception e){
    		logger.error(DateUtilsEx.formatToString(new Date(), DateUtilsEx.DATE_FORMAT_SEC)+" >>修改到期未支付订单状态定时任务执行失败....");
    		logger.error(e);
    		e.printStackTrace();
    	}
        
    }
    
    /**
     * 修改直降、拼团活动状态
     */
    @Scheduled(initialDelay = 20000, fixedRate = ONE_Minute)
    public void activityStateUpdate(){
    	logger.info(DateUtilsEx.formatToString(new Date(), DateUtilsEx.DATE_FORMAT_SEC)+" >>修改直降、拼团活动状态定时任务启动....");
    	try{
    		SpSkuInfoService ssiService = SpringUtil.getBean(SpSkuInfoService.class);
    		
    		ResultEntity re = ssiService.updateLimitAndGroupState();
    		
    		if("0".equals(re.getCode())){
    			logger.info(DateUtilsEx.formatToString(new Date(), DateUtilsEx.DATE_FORMAT_SEC)+" >>修改直降、拼团活动状态定时任务执行成功....");
    		}else{
    			logger.error(DateUtilsEx.formatToString(new Date(), DateUtilsEx.DATE_FORMAT_SEC)+" >>修改直降、拼团活动状态定时任务执行失败....");
    		}
    		
    	}catch(Exception e){
    		logger.error(DateUtilsEx.formatToString(new Date(), DateUtilsEx.DATE_FORMAT_SEC)+" >>修改直降、拼团活动状态定时任务执行失败....");
    		logger.error(e);
    		e.printStackTrace();
    	}
        
    }
    
    /**
     * 订单到期自动确认收货
     */
    @Scheduled(initialDelay = 20000, fixedRate = FIVE_Minute)
    public void orderStateUpdate(){
    	logger.info(DateUtilsEx.formatToString(new Date(), DateUtilsEx.DATE_FORMAT_SEC)+" >>订单到期自动确认收货定时任务启动....");
    	try{
    		OrderService oService = SpringUtil.getBean(OrderService.class);
    		
    		ResultEntity re = oService.updateOrderTakeState();
    		
    		if("0".equals(re.getCode())){
    			logger.info(DateUtilsEx.formatToString(new Date(), DateUtilsEx.DATE_FORMAT_SEC)+" >>订单到期自动确认收货定时任务执行成功....");
    		}else{
    			logger.error(DateUtilsEx.formatToString(new Date(), DateUtilsEx.DATE_FORMAT_SEC)+" >>订单到期自动确认收货定时任务执行失败....");
    		}
    		
    	}catch(Exception e){
    		logger.error(DateUtilsEx.formatToString(new Date(), DateUtilsEx.DATE_FORMAT_SEC)+" >>订单到期自动确认收货定时任务执行失败....");
    		logger.error(e);
    		e.printStackTrace();
    	}
        
    }

}
